
/* $Id: utilitas.c 9 2009-12-29 12:25:52Z calicant $ */

#ifdef AMIGA
#include <proto/locale.h>
#include <libraries/locale.h>
#define CATCOMP_NUMBERS
#define CATCOMP_ARRAY
#endif

#include "edilana.h"

#ifdef AMIGA
extern struct Catalog *catalog;
#endif

/*
 * Toglie da una stringa il carattere NL: il primo che incontra.
 * Restituisce la lunghezza della stringa cosi' modificata.
 *
 */

/*

int Stripnl (char *s)
{
char *curs;

	curs = s;
	while (*curs != '\0' && *curs != '\n') curs++;
	*curs = 0;

return curs-s;
}
*/

int Stripnl (char s[])
{
int i;

for (i = 0; s[i]; i++)
	if (s[i] == '\n') {
		s[i] = '\0';
		break;
	}

return i;
}

/*
 * Apre un file nel modo specificato, restituendone il puntatore. Stampa
 * un messaggio di errore e ritorna NULL in caso di errore.
 *
 */
FILE *IOFile (char *nomefile, char *modo)
{
FILE *punt;

	Stripnl(nomefile);
	if ((punt = fopen (nomefile,modo)) == NULL)
		printf(" *** file error \"%s\"\n",nomefile);

return punt;
}

/*
 * Controlla che i puntatori siano diversi da NULL
 */
int IOFail (FILE *punt1, FILE *punt2)
{
	if (punt1 == NULL || punt2 == NULL) {
		if (punt1) fclose(punt1);
		if (punt2) fclose(punt2);
		return -1;
	}
	else return 0;
}

/*
 * Libera la memoria allocata per la struttura nome con firma
 */
void LiberaMemoria (struct FirmaNome *np[], int maxnomi)
{
register int i;

	for (i = 0; i < maxnomi; i++) {
		free(np[i]->nome);
		free(np[i]->tabe);
		free(np[i]);
	};
}

/*
 * Esce dal programma rimuovendo la sporcizia
 */
void Uscita (int n)
{
	/* svuota l'history buffer */
	LineEdit("","",1);

	/* cancella i file di supporto */
	remove(NOMECANDI);
	remove(NOMERESTO);
	remove(NOMEANAGS);
	remove(NOMENOMIB);
	remove(ALTRECANDI);
	remove(ALTRORESTO);
	remove(ALIASCANDI);
	remove(LemmaCandy);
	remove(TEMPFILE);

	#ifdef AMIGA
	if (catalog)
		ILocale->CloseCatalog(catalog);
	#endif

	/* stampa un messaggio opportuno */
	if (n) {
		fputs("EdilAna: fatal error:", stderr);
		IoDico(n);
	}
	else IoDico(CIAO);
	/* e ritorno all'ambiente esterno */
	exit(n);

}

char *spazioStringa (char *s)
{
char *p;

	p = (char *)malloc(strlen(s) + 1);
	if (p == NULL)
		return p;
	else
		return (char *)strcpy(p,s);
}

int *spazioVettore (int tabe[])
{
int *t;
register int i;

	t = (int *)calloc(NUMALFA,sizeof(int));

	if (t == NULL)
		return t;
	else
		for (i = 0; i < NUMALFA; i++) t[i] = tabe[i];

return t;
}

int 
CostruisciTabella (
	struct FirmaNome *np[],
	char *nomefile, 
	int  numnomi, 
	int  maxnomi
){
struct	FirmaNome *p = NULL;
char	lcorr[MAXSTRLEN], temp[MAXSTRLEN];
int	tab[NUMALFA];
FILE	*inputfile;

	if ((inputfile = IOFile(nomefile,"r")) == NULL)
		return numnomi;

	LiberaMemoria(np,numnomi);
	numnomi = 0;

	while (fgets(lcorr,MAXSTRLEN,inputfile) != NULL) {
		Stripnl(lcorr);
		strcpy(temp,lcorr);
		StringaBase(lcorr,tab);
		p = (struct FirmaNome*)malloc(sizeof(*p));
		if (numnomi >= maxnomi) {
			IoDico(AL_COMPLETO);
			break;
		}
		if (p == NULL || 
			(p->nome = spazioStringa(temp)) == NULL ||
			(p->tabe = spazioVettore(tab)) == NULL)
				Uscita(MANCA_MEMORIA);
		else np[numnomi++] = p;
	}
	fclose(inputfile);

return numnomi;
}

int AbbastanzaLunga (char *s, int l)
{
char temp[MAXSTRLEN];

	strcpy(temp,s);
	if (Pulisci(temp) < l) {
		IoDico(TROPPO_CORTO);
		return 0;
	}
        else return -1;
}

void Inverte (char *s)
{
char temp;
register int i, l, pos;

	l = strlen(s) - 1;

	for (i = 0; i < (l+1)/2; i++) {
		temp = s[i];
		s[i] = s[pos = l - i];
		s[pos] = temp;
	}
}

int Stringa2Cifra (char *s, int max)
{
#ifdef AMIGA
 extern int rand (void);
#endif
int i;
char *curs;

	curs = s;
	while (*++curs)
		if (!isdigit(*curs)) {
			IoDico(SOLO_CIFRE);
			return -1;
		}
	i = atoi(&s[1]);
	if (!i) return rand() % max;
	else if (i > max || i < 0) {
		IoDico(FUORI_LISTA);
		return -1;
	}
	else return i-1;
}

#ifdef AMIGA
void StampaFast (int flag)
{

	if (flag)
		printf("\033[0 p");
	else printf("\033[ p");
}
#endif

#ifdef PASSWORD

#include <time.h>

int TestaPassword (char *testword)
{
static char giorno[]	= "zudtqcssondudtqqsdddzudtqcssontt";
static char mese[]	= "zgfmamglasond";
static char gsett[]	= "lmmgvsd";
static char separat[]	= "aeiouaeiouaeiouaei";
static char daypos[]	= "nnnnnnmmmmmmppppppssssss";
static char numeri[]	= "bcdfglmnpr";

char word[MAXSTRLEN], cifranno;
char nday[MAXSTRLEN];
int separpos, i;

struct tm *tp;
long c;
int wday;

	time(&c);
	tp = localtime(&c);

	strftime(nday, MAXSTRLEN, "%j", tp);

	sprintf(word, "%d", tp->tm_year+1900);
	cifranno = giorno[word[3] - '0'];

	word[0] = giorno[tp->tm_mday];

	wday = tp->tm_wday;
	if (wday == 0) wday = 7;
	wday--;

	separpos = (tp->tm_mday - 1) / 7 + wday;

	for (i = 1; i < 16; i += 2)
		word[i] = separat[separpos++];

	word[2] = mese[tp->tm_mon+1];
	word[4] = cifranno;
	word[6] = gsett[wday];
	word[8] = daypos[tp->tm_hour];
	word[10]= numeri[nday[0] - '0'];
	word[12]= numeri[nday[1] - '0'];
	word[14]= numeri[nday[2] - '0'];
	word[16] = '\0';


	if (strcmp(word, testword)) return 0;
	else return 1;

}
#endif
